如何解决MSE Nacos连接超时问题?

本文介绍如何排查和解决程序连接MSE Nacos出现的超时问题。

问题现象

当程序连接MSE Nacos出现超时问题时,可能出现如下几种报错:

  • Connection timed out

  • Read Timeout

  • TimeoutException: Waited 3000 milliseconds

问题原因

可能是以下几种原因,导致程序连接MSE Nacos出现超时问题。

  • 客户端与服务端之间的网络传输出现问题,导致客户端发出的请求无法抵达服务端或服务端的回复无法抵达客户端。或者服务端处理请求速度慢,导致客户端误认为超时。

  • 公网域名被ACL策略拦截。

  • 使用VPN导致的网络问题。

  • 客户端的处理线程阻塞或异常,亦或客户端处于Full GC、OOM或CPU争抢等状态, 无法及时处理服务端返回的数据包,导致客户端误认为超时。

解决方案

  • 如果您仅有某一个客户端节点出现超时报错,可能是这些客户端节点与MSE Nacos之间的网络出现问题,或是这些客户端节点存在异常或阻塞。

    此时,您可在错误所在的客户端节点上,使用pingtelnetcurl等命令,访问MSE Nacos集群。查看客户端监控是否存在高CPU使用率、频繁FullGC和OOM等信息,以此排查是否存在网络问题。

    ping ${mse.nacos.host}
    telnet ${mse.nacos.host} 8848
    curl ${mse.nacos.host}:8848/nacos/v1/ns/service/list
  • 如果您使用的是公网域名,请查看是否被ACL策略拦截。

    如何查看是否被ACL策略拦截,请参见设置白名单

  • 如果您使用私网域名,请查看应用是否部署在同一个地域(Region)的同一个私有网络(VPC)内。如果部署于不同的地域或属于不同的私有网络,您需要将应用部署于MSE Nacos所在的地域或私有网络内,或使用云企业网打通不同私有网络。关于云企业网的更多信息,请参见什么是云企业网

    在MSE控制台的基本信息页面,可查看MSE Nacos所处的地域和内网地址对应的VPC ID。

  • 如果您使用了VPN,请关闭VPN或查看VPN设置后重试。

  • 如果您的错误信息存在于所有的客户端节点,请在MSE控制台的监控中心页面,查看Nacos的如下信息:

    如何查看Nacos监控中心的数据,请参见监控引擎

    • 概览页签,查看引擎的每秒查询数每秒操作数是否超过了每秒处理请求数(TPS)。

      关于每秒处理数的取值,请参见实例能力评估

    • 连接数监控页签,查看客户端版本数量和长链路数量是否超过了连接数。

      关于连接数的取值,请参见实例能力评估

    • jvm监控页签,查看引擎Full GC是否频繁出现。

      说明

      No data表示从未进行过Full GC。

    • 当Nacos引擎的网络类型为公网网络时,在资源监控页签,查看资源的入口流量出口流量是否超出购买时指定的带宽大小。

    • 资源监控页签,查看资源的内存使用率CPU使用率是否接近或超过100%,导致超出承受能力后被限流。请尝试变更实例规格进行升配。

      如何变更实例规格,请参见变更实例规格

    • 如果仅是偶尔发生超时错误,请考虑设置更长的超时时间避免此类问题。

      • 若您的Java Client版本为1.0.0~1.4.X,请在应用进程的JVM参数中添加如下参数:

        -D com.alibaba.nacos.client.naming.ctimeout=${注册中心连接超时时间,单位毫秒,默认3000}
        -D com.alibaba.nacos.client.naming.rtimeout=${注册中心请求超时时间,单位毫秒,默认50000}
        -D NACOS.CONNECT.TIMEOUT=${配置中心连接超时时间,单位毫秒,默认1000}
      • 若您的Java Client版本为2.0.0~2.1.1, 请将Java Client版本先升级至2.1.2及以上,再设置超时时间。

      • 若您的Java Client版本为2.1.2及以上,请在应用进程的JVM参数中添加如下参数:

        -Dnacos.remote.client.grpc.timeout=${请求超时,单位毫秒,默认3000}
        ## 检测所连接的服务端是否健康,不健康则触发重连
        -Dnacos.remote.client.grpc.server.check.timeout=${服务端健康检测,单位毫秒,默认3000}
        ## 检测当前连接状态是否健康,不健康则触发重连
        -Dnacos.remote.client.grpc.health.timeout=${连接健康检测,单位毫秒,默认3000}